package com.ruoyi.ldzlsc.mapper;

import com.ruoyi.ldzlsc.domain.vo.ScProductionPlanVo;
import com.ruoyi.ldzlsc.domain.vo.ScBomVo;
import com.ruoyi.ldzlsc.domain.vo.ScProductionPlanDetailVo;
import com.ruoyi.ldzlsc.domain.vo.ScItemStockVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 生产计划Mapper接口
 *
 * @author ruoyi
 * @date 2023-05-15
 */
public interface ScProductionPlanMapper {
    /**
     * 查询生产计划
     *
     * @param scProductionPlanVo 生产计划
     * @return 生产计划集合
     */
    List<ScProductionPlanVo> selectScProductionPlanList(ScProductionPlanVo scProductionPlanVo);
    
    /**
     * 根据计划编号查询计划详情
     *
     * @param planCode 计划编号
     * @return 生产计划
     */
    ScProductionPlanVo selectScProductionPlanByPlanCode(String planCode);
    
    /**
     * 根据计划编号查询计划明细
     * 
     * @param planCode 计划编号
     * @return 计划明细列表
     */
    List<ScProductionPlanDetailVo> selectPlanDetailListByPlanCode(String planCode);
    
    /**
     * 根据ID查询生产计划
     * 
     * @param productionPlanId 生产计划ID
     * @return 生产计划
     */
    ScProductionPlanVo selectScProductionPlanById(Long productionPlanId);
    
    /**
     * 根据产品ID查询有效的BOM
     * 
     * @param productId 产品ID
     * @return BOM
     */
    ScBomVo selectActiveBomByProductId(Long productId);
    
    /**
     * 根据物料ID列表查询库存
     * 
     * @param materialIds 物料ID列表
     * @return 库存信息
     */
    List<ScItemStockVo> selectItemStockByMaterialIds(List<Long> materialIds);

    /**
     * 更新生产计划状态
     *
     * @param planCode 计划编号
     * @param status 状态
     * @return 结果
     */
    int updateScProductionPlanStatus(@Param("planCode") String planCode, @Param("status") String status);

    /**
     * 新增生产计划主表
     *
     * @param scProductionPlanVo 生产计划信息
     * @return 结果
     */
    int insertScProductionPlan(ScProductionPlanVo scProductionPlanVo);

    /**
     * 新增生产计划明细表
     *
     * @param productionPlanId 生产计划ID
     * @param productId 产品ID
     * @param plannedQty 计划数量
     * @param planStartTime 计划开始时间
     * @param planEndTime 计划结束时间
     * @param requiredDate 需求日期
     * @return 结果
     */
    int insertScProductionPlanDetail(@Param("productionPlanId") Long productionPlanId,
                                    @Param("productId") Long productId,
                                    @Param("plannedQty") BigDecimal plannedQty,
                                    @Param("planStartTime") Date planStartTime,
                                    @Param("planEndTime") Date planEndTime,
                                    @Param("requiredDate") Date requiredDate);
    /**
     * 修改生产计划主表
     *
     * @param scProductionPlanVo 生产计划信息
     * @return 结果
     */
    int updateProductionPlan(ScProductionPlanVo scProductionPlanVo);
    
    /**
     * 修改生产计划明细
     *
     * @param scProductionPlanVo 生产计划信息
     * @return 结果
     */
    int updateProductionPlanDetail(ScProductionPlanVo scProductionPlanVo);
    
    /**
     * 删除生产计划明细
     * 
     * @param productionPlanIds 生产计划ID列表
     * @return 结果
     */
    int deleteProductionPlanDetailByIds(Long[] productionPlanIds);
    
    /**
     * 删除生产计划
     * 
     * @param productionPlanIds 生产计划ID列表
     * @return 结果
     */
    int deleteProductionPlanByIds(Long[] productionPlanIds);

    /**
     * 更新计划状态为已完成
     * @param planId
     * @param username
     * @return
     */
    public int updateStatusToComplete(@Param("planId") Long planId, @Param("username") String username);

    /**
     * 根据计划ID获取生产订单ID
     * @param planId
     * @return
     */
    public Long getProductionOrderIdByPlanId(Long planId);

    /**
     * 统计未完成的计划数量
     * @param orderId
     * @return
     */
    public long countUnfinishedPlansByOrderId(Long orderId);
} 